/**
 * 增强函数分发功能
 * @param {*} actionCreator 单个 action 
 * @param {*} dispatch 派发函数
 * @returns 
 */
export function bindActionCreator(actionCreator, dispatch) {
    return (...args) => {
        return dispatch(actionCreator.apply(this, args))
    }
}


/**
 * 增强派发函数功能
 * @param {*} actionCreators 对象或者函数
 * @param {*} dispatch 派发函数
 */
export function bindActionCreators(actionCreators, dispatch) {
    // 第一个参数为函数时
    if (typeof actionCreators === "function") {
        return bindActionCreator(actionCreators, dispatch);
    }
    // 不是对象或者函数时直接抛错处理
    if (typeof actionCreators !== 'object' || actionCreators === null) {
        throw new TypeError("bindActionCreators expected an object or a function");
    }
    // 返回出去的结果
    const boundActionCreators = {};
    // 遍历对象获取每个 action 描述
    for (const key in actionCreators) {
        const actionCreator = actionCreators[key]; // 取出对象属性值
        // 验证属性值必须为函数, 非函数不做处理
        if (typeof actionCreator === 'function') {
            boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);
        }
    }
    return boundActionCreators
}